home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / msdos / raytrace / pov / gen / bstone / bstone.doc next >
Text File  |  1994-04-20  |  31KB  |  1,018 lines

  1.  
  2.  
  3. BUILDSTONE BASIC V0.9(test)
  4.  
  5.  
  6. 0. Introduction
  7. ===============
  8.  
  9. Buildstone Basic is a special-purpose Basic interpreter:
  10. Many fans of the popular raytracer POV use to write programs for 
  11. producing input files. This interpreter was prepared to make
  12. time between idea and POV input a little bit shorter.
  13.  
  14. Since B'stone has got the ability to handle numbers and vectors as well
  15. as objects and CSG shapes, you don't have to take care about the data
  16. structure for your program. Please look at the examples for an idea of
  17. what can be done with B'stone.
  18.  
  19. To use B'stone Basic successfully you should have some experiences with
  20. a Basic interpreter and the POV raytracer V2.0. B'stone uses POV 2.0
  21. syntax.
  22.  
  23.  
  24. 0.1 Some Properties
  25. ===================
  26. - no graphic preview
  27. - data types: scalar, vector, object, scalar array, vector array,
  28.   bit array
  29. - scalar and vector functions and operations
  30. - translation, scaling and rotation of objects
  31. - translation, scaling and rotation of objects within the object space
  32. - ability to "connect the dots"
  33. - management of CSG objects (union, intersection, difference)
  34. - automatic calculation of bounding shapes
  35. - debug options, tracing, break
  36. - bugs, of course.
  37.  
  38.  
  39. 0.2 Hardware / OS
  40. =================
  41. The program has been tested with 386/486 DOS machines on DOS 5/6.
  42. A Coprocessor is not strictly required, but it is recommended.
  43. Bstone doesn't use XMS/EMS and runs in a DOS-box under Windows 3.
  44. Later versions will probably come with ANSI compatible source code.
  45.  
  46. Tip: The author prefers a multitasking / graphic environment (Windows)
  47. running a command shell (DOS-box) and a text editor simultaneous. With
  48. this configuration you should be able to drag and drop or cut and
  49. paste text lines from the editor into the Basic interpreter directly.
  50.  
  51. Bug: There is an annoying bug which is probably system-related: The break
  52. key, CTRL-C, seems to work properly with DOS 5.0, but not with DOS 6.0.
  53. Machines running DOS 6 have been reported to hang up after CTRL-C. The
  54. reason is unknown.
  55.  
  56.  
  57.  
  58.  
  59. 1. Starting / Finishing the Program
  60. ===================================
  61. Type "bstone" at the OS prompt. A short message from the author,
  62. option infos and the command line prompt appears. Now you can type
  63. the commands you like.
  64. Type
  65.     10 print "Hello world !"
  66.     goto 10
  67.  
  68. and you will see what is going on.
  69. To finish B'stone type
  70.     
  71.     end
  72.  
  73.  
  74. 1.1 Options
  75. ===========  
  76. Valid options are:
  77.  
  78.     -h,-?    Get a help message.
  79.     -d    Turn debugging on. Writes the log / status file
  80.                 "bstone.log" during a session.
  81.     -b    Disable CTRL-C. If not switched off, you can stop
  82.         program execution with CTRL-C. This will slow down
  83.         a MS-DOS version. (See hardware/OS hints also.)
  84.     -s    Disable automatic save. If not disabled, B'stone will
  85.         write your actual program text into the file
  86.         "bstone.sav" at the end of a session.
  87.     -l    Disable automatic listing. If not disabled, you will
  88.         get an automatic listing after every command.
  89.         file    Loads the command script "file".
  90.  
  91.  
  92. 2. Basic
  93. ========
  94. B'stone is a Basic INTERPRETER. If a line starts with a number,
  95. for instance
  96.  
  97.     10 print "Hello world !"
  98.  
  99. B'stone accepts this as a part of a program. If you type it without
  100. the line number
  101.  
  102.        print "Hello world !"
  103.  
  104. B'stone will execute the print command immediately and you will get
  105. the well-known message.
  106. In both cases B'stone translates the line into an internal tokenized
  107. representation doing syntax checks. If the line is not OK you
  108. will receive an error message before the line is executed or stored.
  109. This works also for command scripts. Command scripts are implemented
  110. as an input redirection from a file.
  111.  
  112.  
  113. 2.1 Writing / Starting a Basic Program
  114. ======================================
  115. You may write your program with your favourite text editor. It should
  116. look like this:
  117.  
  118.     10 print "Hello world"
  119.     20 REM This is a comment
  120.  
  121. B'stone doesn't care about upper and lower cases of the letters or
  122. the order of the line numbers.
  123. You can start bstone with the filename as an option or you may type
  124. at the command prompt:
  125.  
  126.     load "c:/bstone/my_file.bas"
  127.  
  128. The other way is typing in the program lines directly.
  129. To see your program or parts of it use:
  130.  
  131.     list
  132. (or)    list 10
  133. (or)    list 10,20
  134.  
  135. If automatic listing is enabled (it is enabled by default) you can look
  136. at a specific line and its neighbours:
  137.  
  138.     30 #
  139.  
  140. To delete a program line / program lines use:
  141.  
  142.     new
  143. (or)    10
  144. (or)    delete 10
  145. (or)    delete 10,20
  146.  
  147. To replace program line 30 with line 10:
  148.  
  149.     30 10
  150.  
  151. Finally, you want to start execution:
  152.  
  153.     run
  154. (or)    run 10
  155. (or)    goto 10
  156.  
  157. If the programs hangs up due to an infinite loop and break is not
  158. disabled, press CTRL-C. If nothings happens probably important data
  159. has been overwritten or your operating system or hardware is incompatible
  160. to the CTRL-C handler (it has been tested for 386/486 computers with DOS 5).
  161. Unfortunately these bugs are hard to detect and have a good chance
  162. to survive.
  163.  
  164. For a detailed explanation of commands see the next chapters.
  165. Look at the examples and experiment to learn B'stone Basic.
  166.  
  167.  
  168. 2.2 Data Types
  169. ==============
  170. B'stone knows the following data / variable types: scalar, vector,
  171. object, scalar array, vector array, bit array.
  172. String is not a real data type, but it will be explained here, too.
  173.  
  174. Scalar (float):
  175. ---------------
  176.     constants:    10  10.3  10.3e-4  PI
  177.     variables:    A  ALPHA  C3  X_3
  178.  
  179. When an integer number is required the digits after the decimal point
  180. are cut off.
  181.  
  182. Vector:
  183. -------
  184.     constants:    <1,1,-2.3>  <A,2,ALPHA>  V0  VX  VY  VZ
  185.     variables:    A^  ALPHA^  C3^  X_3^
  186.  
  187. V0,VX,VY,VZ are predefined vector constants.
  188. An at-sign '@' preceding scalar and vector values means that they are
  189. in degrees (otherwise they are in radiant):
  190. @< 90, 90, 90 > is equal to < @90, @90, @90 > or < PI/2, PI/2, PI/2 >.
  191.  
  192. Object:
  193. -------
  194.     variables:    A$  ALPHA$  C3$  X_3$
  195.  
  196. This data type represents simple objects and CSG objects, textures
  197. and bounding shapes.
  198. Scalars, vectors and arrays may be used in expressions, objects not.
  199.  
  200. Array:
  201. -------
  202.     Scalar Array:    A[3]  ALPHA[3][7]  C3[A]  X_3[10][10]
  203.  
  204.     Vector Array:    A^[3]  ALPHA^[3][7]  C3^[A]  X_3^[10][10]
  205.  
  206.     Bit Array:    BIT A[3]  BIT ALPHA[7][4]
  207.  
  208. The purpose of bit arrays is to save memory if only the setting
  209. information of a point field is needed. Since scalar or vector
  210. arrays use 8 Bytes per value, they could be too large.
  211. There is a need for memory allocation for arrays. You have to use the
  212. "DIM" command _before_ using an array:
  213.  
  214.     DIM A[10][10]
  215.     DIM A^[2]
  216.     DIM BIT A[256][8]
  217.  
  218. The indices start with 1 and end with n. In later versions of B'stone
  219. this may have been changed to 0 and n-1.
  220.  
  221. If you use a scalar or vector variable for an array with and without
  222. indices, the variable without indices points to the location in the array
  223. where the last access took place. This is a side effect which can
  224. lead to confusion.
  225.  
  226. Example:
  227.     DIM A[10]
  228.     LET A[4]=3
  229.     PRINT "A[4]",A
  230.  
  231.  
  232. String
  233. ------
  234. Strings are no specific data type, because you can not use them as the
  235. left hand side in assignments. Strings always look like:
  236.  
  237. "Hello world !"
  238.  
  239. There are special characters for strings:
  240.  
  241. \    this can be used to write strings, "which are longer \
  242.     than one line." Use it only in case of emergency.
  243. \\    Backslash
  244. \n    Newline
  245. \t    Tabulator
  246.  
  247.  
  248.  
  249. 2.3 Vector and Scalar Functions
  250. ===============================
  251. The syntax for functions is FUNCTION ( arguments ), for instance
  252. SQRT(3), square root of 3. Most of them are standard. See Appendix A.
  253. The TRANSFORM functions are used for coordinate transformations.
  254.  
  255.  
  256. 2.4 Expressions
  257. ===============
  258. You can make scalar and vector expressions, for instance
  259.     (A*B+A^*B^)*SQRT(3)
  260. Take care about the precedence of the operators and use brackets if
  261. you are not sure.
  262. Objects or strings are not allowed in expressions.
  263. Look at the operator table (Appendix B).
  264.  
  265.  
  266. 2.5 Commands
  267. ============
  268. B'stone permits one command per command line only.
  269. Object managing commands have got a separate chapter. 
  270. For a short reference of commands see Appendix C.
  271.  
  272. 2.5.1 Miscellanous Commands
  273. ---------------------------
  274. REM This is a comment
  275. This is used to write comments into programs. Example:
  276.     10 REM Never ending story....
  277.     20 GOTO 20
  278.  
  279. NEW
  280. clears anything, program and variables. You get a "blank sheet".
  281.  
  282.  
  283. 2.5.2 Program Development
  284. -------------------------
  285. LIST
  286. displays the complete program you wrote on the screen. After one
  287. screenfull it stops and expects <ENTER> to continue.
  288.  
  289. LIST 100
  290. lists any program line beginning with 100.
  291.  
  292. LIST 100,200
  293. lists any program line from 100 to 200.
  294.  
  295. DELETE 100
  296. deletes any program line beginning with 100.
  297. ATTENTION: You delete a single line with typing the line number only.
  298.  
  299. DELETE 100,200
  300. deletes any program line from 100 to 200. 
  301.  
  302.  
  303. 2.5.3 Debugging
  304. ---------------
  305. STOP
  306. stops program execution. You can continue execution by using the
  307. CONT command. STOP will be used for breakpoints and for stopping the
  308. program for input (there is no input command !).
  309. Example:
  310.  
  311.     C1> RUN
  312.         ...stopped at line 30
  313.     10  REM Input of A required
  314.     20  STOP
  315.     30  LET B=A
  316.     
  317.     C2> A=1700
  318.     C3> CONT
  319.  
  320.  
  321. CONT
  322. continues program execution after STOP or CTRL-C.
  323.  
  324. TRACE 0
  325. disable execution tracing.
  326.  
  327. TRACE 1
  328. enable execution tracing. The program stops after each executed line,
  329. shows the line, and eventually data used there. The program continues
  330. after pressing <ENTER>. If you type n<ENTER> the program stops. It can
  331. be continued using the CONT command.
  332. Other trace levels are defined but only important for the developer.
  333.  
  334.  
  335. 2.5.4 Execution Control
  336. -----------------------
  337. RUN
  338. starts program execution with the least line number.
  339.  
  340. RUN 10
  341. starts program execution with line number 10. There is a little
  342. difference to GOTO 10: RUN will clear the GOSUB stack.
  343.  
  344. END
  345. terminates program execution, if END is part of a Basic program.
  346.  
  347. GOTO 10
  348. jumps to line number 10. Extensive use of GOTO will produce so
  349. called confusing "spaghetti code". You should try to avoid this
  350. problem with discipline.
  351. If the line number GOTO is searching for doesn't exist, GOTO jumps to
  352. the next higher one. This is also true everywhere line numbers are
  353. used.
  354. Goto doesn't permit variable line numbers.
  355.  
  356.  
  357. GOSUB 1000
  358. makes a call to the subroutine at line 1000. The last command of this
  359. subroutine must be RETURN.
  360. Example:
  361.     10 A=0
  362.     20 GOSUB 100
  363.     30 GOSUB 100
  364.     40 GOSUB 100
  365.     50 END
  366.     100 A=A+1
  367.     110 PRINT "Call No ",A
  368.     120 RETURN
  369.  
  370. GOSUB doesn't permit variable line numbers.
  371.  
  372. RETURN
  373. returns from subroutine.
  374.  
  375. IF A<B THEN PRINT "A is less than B"
  376. Conditional execution of the command after THEN. It will be used
  377. very often together with GOTO. The condition is a scalar expression.
  378. If the expression is 0 then the condition becomes false and the command
  379. after THEN will not be executed.
  380. There is one exception with GOTO: Since IF is used with GOTO
  381. very often, B'stone accepts the following:
  382. IF A<B GOTO 10
  383.  
  384.  
  385. FOR i=1 TO 10
  386. FOR i=1 TO 10 STEP 2
  387. NEXT i
  388. These are loop commands. They can be used in programs only. The loop
  389. body is between the FOR state and the corresponding NEXT command. The
  390. reference is done by the loop variable (i in this case). The loop
  391. variable must not be an array.
  392. The step is the value the loop variable is increased by.
  393. If there is no STEP keyword the step value is 1.
  394. Example:
  395.  
  396.     10 FOR i=1 to 10 STEP 2
  397.     20 PRINT "I=",i
  398.     30 NEXT i
  399.     40 REM End of the loop
  400.  
  401. If execution reaches line 10, the step value (2) and the end value (10)
  402. are stored. If execution reaches line 30 it will be checked if i+2
  403. is greater than 10. If true the program jumps to the following line.
  404. If false i becomes i+2 and the program jumps to line 20.
  405. The numbers 1 3 5 7 9 are printed. i remains 9.
  406. In this example:
  407.  
  408.     10 FOR i=1 to 10     
  409.     20 PRINT "I=",i
  410.     30 NEXT i
  411.  
  412. the numbers from 1 to 10 will be printed.
  413. The loop body will be executed at least once, e.g.
  414.  
  415.     10 FOR i=1 to 0
  416.     20 PRINT "I=",i
  417.     30 NEXT i
  418.  
  419. will print I=1.
  420.  
  421.  
  422.  
  423. 2.5.5 Loading / Saving Command Scripts
  424. --------------------------------------
  425. LOAD "c:/bstone/my_file.bas"
  426. LOAD "my_file.bas"
  427. Loads the command script mentioned. You don't need to specify
  428. the full path name, relative path names are permitted.
  429. Loading works like typing in. (It is just another input stream.) 
  430.  
  431. END
  432. The exact meaning of END without leading line number is
  433. "the input stream has to be closed". Of course this terminates
  434. B'stone when you are typing this command from console.
  435.  
  436. SAVE "c:/bstone/my_file.bas"
  437. SAVE "my_file.bas"
  438. Saves the program into the file. The second form saves the file
  439. into your current working directory. SAVE has been implemented quite
  440. similar to LIST.
  441.  
  442. SAVE 100 "c:/bstone/my_file.bas"
  443. Saves the program beginning with line 100.
  444.  
  445. SAVE 100,200 "my_file.bas"
  446. Saves the program from line 100 to line 200.
  447.  
  448. SAVE TRACE "my_file.bas"
  449. Saves the complete program, but with automatic line numbers. It doesn't
  450. use the original line numbers but counts them beginning with 10 and a
  451. step of 10. Jumps (GOTO, GOSUB) are "normalized" also, but nothing else.
  452. Use this if you are confused by line numbers with short distances.
  453.  
  454.  
  455. 2.5.6 Writing and Displaying Data
  456. ---------------------------------
  457. FOPEN    
  458. FOPEN "c:/bstone/pov.inc"
  459. Fopen opens a file or device for FPRINT. The first form redirects the
  460. FPRINT output to screen. The second form opens the mentioned file.
  461. Every output written to the file will be appended to the end
  462. of the old file (mode "w+").
  463.  
  464. DELETE "c:/bstone/pov.inc"
  465. Similar to FOPEN, but deletes the file before using it.
  466.  
  467. PRINT expressions
  468. FPRINT expressions
  469. These commands are similar. They use different output devices.
  470. PRINT writes to the screen, FPRINT writes to a file opened with
  471. FOPEN or DELETE. The default is the standard output device.
  472. Every data type, including strings, can be printed. Data terms are
  473. separated with commas.
  474. Empty expressions are not printed and will produce an error message.
  475. Examples are:
  476.     PRINT a*b
  477.     FPRINT "#declare MyObj = ",MyObj$
  478.     PRINT "The cross product of ",a^," and ",b^," is ",a^# b^
  479.  
  480.  
  481. 2.5.7 Data Management (objects excluded)
  482. ----------------------------------------
  483. DIM A[10]
  484. The DIM command is necessary for reserving memory for arrays. At the
  485. time of translation the translator knows nothing about the size of 
  486. arrays. You must tell the program how much elements your arrays
  487. contain and which range of indices should be used.
  488. Examples:
  489.     Scalar array:    DIM A[10][10]
  490.     Vector array:    DIM B^[8]
  491.     Bit array:    DIM BIT C[256][10][8]
  492. Remember, the indices of arrays start with 1 and end with the values
  493. given above. You receive an error message if you are out of this range.
  494. Be careful: it is not checked if you use the bit fields always in the
  495. right context. This isn't good style but will work:
  496.     DIM BIT C[256][8]
  497.     PRINT C[1][1]
  498.  
  499. LET A=B
  500. A=B
  501. The LET command refers to a data transfer operation, called
  502. "assignment". Assignment with and without LET is equal. The LET
  503. keyword has been introduced due to tradition. You can assign
  504. data of the same type only (except for some object assignments which
  505. will be explained later), e.g:
  506.  
  507.     LET A=3
  508.     LET B=17*4+SQRT(C)*Z[17]
  509.     LET D[4]=A^*B^
  510.     LET A^=<1,1,1>
  511.     LET B^[3][9]=C^# D^+Z^[12]
  512.     LET A$=B$
  513.  
  514.  
  515.  
  516. 2.6 Object Management
  517. =====================
  518. Things described until now make Basic working, but the core of
  519. B'stone are object operations. Objects are the things you call
  520. "object" or "texture" in POV.
  521. They have a quite complex data structure in their background.
  522. Amongst other things there are pointers to texture and bounding
  523. objects and a string to define the object as a "sphere { <0,0,0> 1 }"
  524. or "Gold_Metal". Every object keeps its own coordinate system to
  525. store the effects of a sequence of translations, rotations and
  526. scalings. You can make unions, intersections or differences of them
  527. with simple operations and within loops, a thing often requested
  528. by POV users. In fact, this data structure is approx. 100 Bytes long.
  529. But this is for your interest only. Usually you will not see these
  530. things except for running out of memory.
  531.  
  532.  
  533. 2.6.1 Initialize Objects
  534. ------------------------
  535. DELETE A$
  536. brings the object A$ into its initial state.
  537.  
  538. DELETE TEX A$
  539. deletes the texture object corresponding to A$.
  540.  
  541. DELETE BOUND A$
  542. deletes the bounding shape of A$.
  543.  
  544. A$="box {<-1,-1,-1><1,1,1>}"
  545. LET B$="My_Obj"
  546. These assignments define the appearance of the objects. These strings
  547. will be copied to the POV file directly. Example:
  548.     
  549.     LET A$="My_declared_Object"
  550.     PRINT A$
  551.  
  552. and you should see
  553.  
  554.     object { My_declared_Object
  555.     }
  556.  
  557. The default string is "sphere { <0,0,0> 1 }". Try to define your
  558. objects so that they are fitting into a unit box (lower left:
  559. <-1,-1,-1>, upper right: <1,1,1> ) and scale, translate and rotate
  560. them afterwards into the position and size you want. This is the
  561. only way to make automatic bound calculation and ctds possible.
  562. Example:
  563.  
  564.     WRONG:    LET A$="sphere { <0,0,0> 2 }"
  565.     OK:    LET A$="sphere { <0,0,0> 1 }"
  566.         LET A$=SCALE( A$, <2,2,2> )
  567.  
  568.  
  569.  
  570. A$=<1,1,1>
  571. LET B$=VX+VY+VZ
  572. You can set the location of your object directly.
  573. Example:
  574.  
  575.     LET A$="My_Obj"
  576.     LET A$=<17,17,3>+<1,1,0>
  577.     PRINT A$
  578.  
  579. and you should see
  580.  
  581.     object { My_Obj
  582.      translate <18,18,3>
  583.     }
  584.  
  585.     
  586.  
  587. 2.6.2 Assigning Objects
  588. -----------------------
  589. The basic operation for objects are assignments. You can assign
  590. objects or object creating functions to objects. You can assign
  591. textures and bounding shapes, too. Since there is a fair amount
  592. of object creating functions, the author breaks the principle of
  593. showing examples and uses the terms "object" and "object_function"
  594. instead.
  595. Here is a list of possible assignments:
  596.  
  597. object = object
  598. Simple object assignment. Example: LET A$=B$
  599.  
  600. object = object_function
  601. Assignment of object functions. (see the next chapters)
  602. Example: LET A$=PLANE(V0,VY)
  603.  
  604.  
  605. TEX object = object
  606. TEX object = object_function
  607. Assignment of an object or an object function to a texture. Currently
  608. the only sensible object functions for textures are other textures.
  609. Example: LET TEX A$ = TEX B$
  610. The default string for texture objects is "MyTexture".
  611.                 
  612.  
  613. BOUND object = object
  614. BOUND object = object_function
  615. Assignment of an object or an object function to a bounding object.
  616. Example: LET BOUND A$=B$
  617. Do not use bounding shapes or textures in objects assigning to a bound.
  618.  
  619.  
  620.  
  621. 2.6.3 Object Functions
  622. ----------------------
  623. Object functions are parts of objects or manipulations of objects or
  624. sets of objects. Common object functions are translation, scaling
  625. and rotation. Object functions can be used as the right hand side in
  626. assignments only. You can not print them or use them instead of
  627. object variables within other object functions.
  628.  
  629.  
  630. 2.6.3.1 Miscellanous Object Functions
  631. -------------------------------------
  632. These are some obvious functions, for instance:
  633. Object itself:                A$
  634. Texture of an object:            TEX A$
  635. Bounding shape of an object:        BOUND A$ 
  636.  
  637. Examples:
  638.     LET B$=A$
  639.     LET B$=TEX A$
  640.     LET B$=BOUND A$
  641.  
  642.  
  643. 2.6.3.2 Translation, Scaling, Rotation
  644. --------------------------------------
  645. These are the usual object transformation functions:
  646. TRANSLATE,SCALE,ROTATE.
  647.  
  648. Examples:
  649.     LET B$=TRANSLATE(A$,<1,1,1>)
  650.     LET B$=SCALE(A$,<3,3,3>)
  651.     LET C$=ROTATE(A$,<@30,0,0>)
  652.  
  653. Remember, you must specify degrees with the preceding '@' if you
  654. want to use them.
  655.  
  656.  
  657. 2.6.3.3 Translation, Scaling, Rotation in Object Space
  658. ------------------------------------------------------
  659. Every object has its own coordinate system. Imagine you are sitting
  660. in an airplane: the x arrow points to the propeller, the y arrow
  661. goes through the roof of the cabin and the z arrow is the left wing.
  662. The object space transformation functions take this coordinate
  663. system as their base.
  664.  
  665. You are somewhere in space:
  666. DELETE Cessna$
  667. LET Cessna$=ROTATE(Cessna$,<0,@45,0>)
  668.  
  669. Fly a short time straight on.
  670. LET Cessna$=TRANSLATE#(Cessna$,<100,0,0>)
  671.  
  672. Fly a roll (fasten your seatbelt!):
  673. LET Cessna$=ROTATE#(Cessna$,<@180,0,0>)
  674.  
  675. Transform your Cessna into a 747 Jumbo Jet:
  676. LET Jumbo$=SCALE#(Cessna$,<100,100,100>)
  677.  
  678. Watch the development of the results (PRINT Cessna$,Jumbo$).
  679.  
  680.  
  681. 2.6.3.4 Object Creating Functions (PLANE,CTDS)
  682. ----------------------------------------------
  683. PLANE(A^,B^)
  684. Creates a plane with A^ as reference point and B^ as normal vector.
  685. Example:
  686.     LET A$=PLANE(<0,0,1>,-VZ)
  687.  
  688. PLANE(P1^,P2^,P3^)
  689. Makes a plane from the three points. The resulting normal vector creates 
  690. a LEFT hand system with the vectors P2^-P1^,P3^-P1^.
  691. Example:
  692.     LET A$=PLANE(V0,VX,VY)
  693. This is the same as "plane { z, 0 }".
  694.  
  695. CTDS(A$,B$)
  696. Assumes that A$ and B$ are transformed unit spheres and creates a
  697. connecting cone.
  698. Example:
  699.     DELETE A$
  700.     LET B$=TRANSLATE(A$,VX)
  701.     LET B$=ROTATE(B$,<0,@45,0>)
  702.     LET B$=SCALE#(B$,<0.2,0.2,0.2>)
  703.     LET C$=CTDS(A$,B$)
  704.  
  705. CTDS(A$,B$,C$)
  706. (As many objects as you like) Assumes that all objects are transformed
  707. unit spheres and creates a union of connecting cones.
  708. Example:
  709.     DELETE A$
  710.     LET B$=TRANSLATE(A$,VX+VY)
  711.     LET B$=SCALE#(B$,<0.5,0.5,0.5>)
  712.     LET C$=TRANSLATE(A$,-VX+VZ)
  713.     LET C$=SCALE#(C$,<0.3,0.3,0.3>)
  714.     LET D$=CTDS(C$,A$,B$)
  715.  
  716.  
  717. 2.6.3.4 CSG Objects
  718. -------------------
  719. With B'stone you can create CSG objects or add objects to CSG objects.
  720.  
  721. UNION(A$,B$,C$)
  722. (As many objects as you like) Creates a union of the objects.
  723. Example:
  724.     LET D$=UNION(A$,B$,C$)
  725.  
  726. SECT(A$,B$,C$)
  727. (As many objects as you like) Creates an intersection of the objects.
  728. Example:
  729.     LET D$=SECT(A$,B$,C$)
  730.  
  731. DIFF(A$,B$,C$)
  732. (As many objects as you like) Creates a difference of the objects.
  733. Example:
  734.     LET D$=DIFF(A$,B$,C$)
  735.  
  736.  
  737. ADDOBJ(A$,B$,C$)
  738. (As many objects as you like) Adds the objects B$ and C$ to an
  739. existing union, intersection or difference A$. If A$ is not a CSG
  740. object ADDOBJ will create a new union. Be careful with ADDOBJ, using
  741. it within loops could lead to memory problems.
  742. Example:
  743.     DELETE A$
  744.     LET A$=ADDOBJ(A$,B$)
  745.     LET A$=ADDOBJ(A$,C$)
  746.  
  747.  
  748.  
  749. 2.6.4 Bounding Shape Calculation
  750. --------------------------------
  751. B'stone is able to calculate a bounding box for objects and CSG
  752. objects.
  753. Within unions it looks for a bounding box containing every included
  754. element. For intersections it will take the smallest element and for
  755. differences B'stone will use the first one.
  756. It is required that every untransformed, unbounded primitive fits
  757. into the { <-1,-1,-1>< 1, 1, 1>} box.
  758. Calculation of bounding boxes considers bounding shapes existing
  759. already. If the highest object in the hierarchy has got a bounding
  760. shape yet, delete it with DELETE BOUND A$.
  761.  
  762. The command is BOUND A$.
  763.  
  764. Example:
  765.     DELETE A$
  766.     LET A$=SCALE(A$,<10,2,1>)
  767.     LET BOUND B$=A$
  768.     DELETE C$
  769.     LET C$=TRANSLATE(C$,-12*VX)
  770.     LET M$=UNION(B$,C$)
  771.     BOUND M$
  772.     PRINT M$
  773.  
  774.   
  775.  
  776. 3. Conclusions
  777. ==============
  778.  
  779. 3.1 Note from the Author
  780. ========================
  781. Well, I know Basic is slow and absolutely out. But it was a simple way
  782. to combine some algorithms with an easy-to-implement programming
  783. language. Probably most programmers have seen Basic before and are
  784. able to write Basic programs or can learn it with small effort.
  785.  
  786. I would welcome a different realization, too. For instance,
  787. it could be possible to create a C++ library. If you plan such thing,
  788. please inform me. 
  789.  
  790. Ideas how to improve the program and the documentation are always
  791. appreciated. I am interested in what you are doing with it.
  792. My current Internet address is: thiessen@iee.et.tu-dresden.de, but
  793. do not mail every question you have, please. Look into the source code
  794. or books first and try to experiment.
  795. If you find bugs send the "buggy" Basic text and a short comment.
  796. I will collect bugs and make a new program version available when I
  797. have the time.
  798.  
  799. I'd like to apologize for my English. I am not a native English
  800. speaker ( in fact, I am an East German ).
  801.  
  802.  
  803.  
  804. 3.2 Official Information
  805. ========================
  806. Using this program is free.
  807. The package containing the program, the documentation etc. may be
  808. copied freely, but in its original state only. The author will not
  809. agree to any commercial distribution including shareware / freeware
  810. samplers.
  811. There is no warranty for any part of the program or documentation.
  812.  
  813.  
  814.  
  815.  
  816.  
  817. Appendix A: Vector and Scalar Functions
  818. =======================================
  819.  
  820. Result: scalar value
  821. --------------------
  822. ABS(scalar_val)            absolute value
  823. ABS(vector_val)            absolute value (size)
  824. RND(scalar_val)            random value in the range 0..scalar_val
  825. VX(vector_val)            x component of vector_val
  826. VY(vector_val)            y component of vector_val
  827. VZ(vector_val)            z component of vector_val
  828. SIN(scalar_val)            sinus
  829. COS(scalar_val)            cosinus
  830. TAN(scalar_val)            tangens
  831. ASIN(scalar_val)        arcus sinus
  832. ACOS(scalar_val)        arcus cosinus
  833. ATAN(scalar_val)        arcus tangens
  834. EXP(scalar_val)            exponent e^x
  835. LOG(scalar_val)            natural logarithm ln
  836. SQRT(scalar_val)        square root
  837. SQR(scalar_val)            sqare x^2
  838. POW(scalar_val,scalar_val)    power, a^b
  839.  
  840. Result: vector value
  841. --------------------
  842. RND(vector_val)            random vector in the range V0..vector_val
  843. VX(object_var)            x component of object_var
  844. VY(object_var)            y component of object_var
  845. VZ(object_var)            z component of object_var
  846. ROT(vector_val,vector_val)    rotation (arg2^ rotated by arg1^)
  847. SCA(vector_val,vector_val)    uneven scaling
  848. PER(vector_val,vector_val)      perpendicular (arg1^ dot (result^-arg2^) = 0)
  849.  
  850. TRANSFORM#(vector_val,vector_val_x,vector_val_y,vector_val_z)
  851.                 transformation of the 1st vector
  852.                 from the given coordinate 
  853.                 system into standard system
  854.  
  855. TRANSFORM(vector_val,vector_val_x,vector_val_y,vector_val_z)
  856.                 transformation of the 1st vector
  857.                 from standard coordinates
  858.                 into the given system
  859.                 
  860.  
  861.  
  862. Appendix B: Operators
  863. =====================
  864. Operators are sorted by precedence. Operators in the same group have
  865. the same precedence.
  866.  
  867. Result: scalar value
  868. --------------------
  869. scalar_val && scalar_val        logical AND
  870. scalar_val || scalar_val        logical OR
  871.  
  872. scalar_val <  scalar_val        less
  873. scalar_val <= scalar_val        less or equal
  874. scalar_val =  scalar_val        equal (scalars)
  875. vector_val =  vector_val        equal (vectors)
  876. scalar_val >  scalar_val        greater
  877. scalar_val >= scalar_val        greater or equal
  878. scalar_val != scalar_val        not equal (scalars)
  879. vector_val != vector_val        not equal (vectors)
  880.  
  881. scalar_val +  scalar_val        addition
  882. scalar_val -  scalar_val        subtraction
  883.  
  884. scalar_val *  scalar_val        product
  885. vector_val *  vector_val        dot product
  886. scalar_val /  scalar_val        division
  887. scalar_val %  scalar_val        modulo
  888.  
  889. - scalar_val                unary minus
  890. ! scalar_val                logical NOT
  891. @ scalar_val                value in degrees
  892. ( scalar_val )                bracketing
  893. F( arguments )                functions
  894.  
  895. Result: vector value
  896. --------------------
  897. vector_val +  vector_val        vector addition
  898. vector_val -  vector_val        vector subtraction
  899.  
  900. scalar_val *  vector_val        scaling
  901. vector_val #  vector_val        cross product
  902.  
  903. - vector_val                negative vector
  904. @ vector_val                vector of degrees
  905. ( vector_val )                bracketing
  906. < scalar_val,scalar_val,scalar_val >    definition of a vector
  907. F( arguments )                functions
  908.  
  909.  
  910.  
  911. Appendix C: Commands
  912. ====================
  913.  
  914. Miscellanous Commands
  915. ---------------------
  916. (nothing)            empty command
  917. REM text            comment
  918. NEW                clear anything (program and variables)
  919.  
  920. Program Development
  921. -------------------
  922. LIST                list program
  923. LIST val            list program beginning with line number
  924. LIST val,val                    list program from-to
  925. DELETE val            delete beginning with line number
  926. DELETE val,val            delete from-to
  927.  
  928. Debugging
  929. ---------
  930. STOP                stop program execution
  931. CONT                continue program execution
  932. TRACE val            set trace level (0: no tracing)
  933.  
  934. Execution Control
  935. -----------------
  936. RUN                start execution
  937. RUN val                start execution at line number
  938. END                terminate program
  939. GOTO val            jump to line number
  940. GOSUB val            call line number (subroutine)
  941. RETURN                return from call
  942. IF val THEN command        if-then branch
  943. FOR var=val TO val        counting loop
  944. FOR var=val TO val STEP val    counting loop with step
  945. NEXT var            end of counting loop
  946.  
  947. Loading / Saving Command Scripts
  948. --------------------------------
  949. LOAD string            load command script from file
  950. END                end of a script file or program
  951. SAVE string            save program into file 
  952. SAVE val string            save program beginning with line number
  953. SAVE val,val string        save program from-to
  954. SAVE TRACE string        save program with automatic line numbers
  955.  
  956. Writing and Displaying Data
  957. ---------------------------
  958. FOPEN                open display for fprint
  959. FOPEN string            open file for fprint
  960. DELETE string            re-write and open file for fprint
  961. PRINT expressions        display expressions
  962. FPRINT expressions        write expressions into file
  963.  
  964. Data Management (see Appendix D also)
  965. -------------------------------------
  966. DIM array            allocate memory for array
  967. LET variable=expression        assignment
  968. variable=expression        assignment
  969.  
  970.  
  971.  
  972. Appendix D: Object Handling
  973. ===========================
  974.  
  975. DELETE object            clear object
  976. DELETE TEX object        clear texture of object
  977. DELETE BOUND object             clear bounding shape of object
  978. BOUND object            automatic calculation of bounding shape
  979.  
  980. Assignments (with or without LET, "asn_expression")
  981. ---------------------------------------------------
  982. object = string            associate object with string
  983. object = vector_val        define position of object in space
  984. object = obj_funct        object functions / other objects
  985. TEX object = obj_funct        set texture
  986. BOUND object = obj_funct    set bounding shape
  987.  
  988.  
  989. Object Functions ("obj_funct"). Result is:
  990. ------------------------------------------
  991. object                another object
  992. TEX object            texture of an object
  993. BOUND object            bounding shape of an object
  994.  
  995. PLANE (vector,vector)        plane with basis point and normal vector
  996. PLANE (vector,vector,vector)    plane with three points
  997.  
  998. SCALE (object,vector)        scaled object
  999. ROTATE (object,vector)        rotated object
  1000. TRANSLATE(object,vector)    translated object
  1001.  
  1002. SCALE# (object,vector)        scaled object (in object space)
  1003. ROTATE# (object,vector)        rotated object (in "object space")
  1004. TRANSLATE# (object,vector)    translated object (in object space)
  1005.  
  1006. CTDS(object,object)        connecting cone
  1007. CTDS(object,object,...)        union of connecting cones
  1008.  
  1009. UNION(object,object...)        union of objects
  1010. SECT(object,object...)        intersection of objects
  1011. DIFF(object,object...)        difference of objects
  1012.  
  1013. ADDOBJ(object,object...)    adding objects to an existing
  1014.                 union, intersection or difference
  1015.                 default: union
  1016.  
  1017.  
  1018.